package com.hqq.exercise.bit;

/**
 * CountOneInBinary 计算二进制中1的个数
 * 题目描述:
 * 请实现一个函数 输入一个整数 输出该数二进制表示中1的个数
 * 输入样例:
 * 9
 * 输出样例:
 * 2
 * Created by heqianqian on 2017/8/10.
 */
public class CountOneInBinary {

    /**
     * 求余 不支持负数
     */
    public static int countByMod(int num) {
        int count = 0;
        while (num != 0) {
            if (num % 2 == 1) {
                count++;
            }
            num = num / 2;
        }
        return count;
    }

    /**
     * 位运算 不支持负数
     */
    public static int countByBit(int num) {
        int count = 0;
        while (num != 0) {
            count += (num & 0X0001);
            num = num >> 1;
        }
        return count;
    }

    /**
     * 优化的位运算 支持负数
     */
    public static int countByBitBetter(int num) {
        int count = 0;
        while (num != 0) {
            num &= (num - 1);
            count++;
        }
        return count;
    }

    /**
     * 一般的位移运算 支持负数
     */
    public static int countCommon(int num) {
        int count = 0;
        for (int i = 31; i >= 0; i--) {
            if ((num & 1) == 1) {
                count++;
            }
            num = num >> 1;
        }
        return count;
    }
}
